草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - STL 字符串类中的运算符 char*

为什么STL字符串类没有内置重载的char*运算符?他们有什么特定的理由要避免它吗?如果有的话,那么使用带有C函数的字符串类会变得更加方便。我想知道你的看法。 最佳答案 以下是JosuttisSTL书中的引述:However,thereisnoautomatictypeconversionfromastringobjecttoaC-string.Thisisforsafetyreasonstopreventunintendedtypeconversionsthatresultinstrangebehavior(typechar*of

c++ - STL push_back 优化导致数组下标超出数组边界

测试环境:CentOS7.0g++4.8.2ArchLinuxg++4.9.020140604(预发布版)ArchLinuxg++4.9.1编译命令用例:通过:g++-Wallt.cpp失败:g++-Wall-O2t.cpp通过:g++-Wall-O2t.cpp#并将第13行的2替换为3通过:g++-Wall-O2t.cpp#并注释掉第14行通过:g++-Wall-O2--std=c++11t.cpp#forg++4.8/4.9失败信息:t.cpp:Inmemberfunction‘voidstd::vector::_M_insert_aux(std::vecto::iterator,

c++ - STL 算法是否针对速度进行了优化?

我正在测试std::vector上不同循环方式的速度。在下面的代码中,我考虑了5种方法来计算N=10000000个元素的vector的所有元素的总和:使用迭代器使用整数索引使用整数索引,按因子2展开使用整数索引,按因子4展开使用std::accumulate代码是用g++forwindows编译的,用于编译的命令行是:g++-std=c++11-O3loop.cpp-oloop.exe我运行代码4次,测量每个方法的时间,我得到以下结果(时间以微秒为单位,给出了最大值和最小值):迭代器:8002-8007整数索引:8004-9003展开2:6004-7005展开4:4001-5004累积

c++ - STL 容器的转发 header

header有伴如果我只需要流的指针或引用,这就足够了。后者是重载时的常见场景operator.STL容器是否有这样的header?我想定义几个引用STL容器的函数,我不想包含,,等。阿尔。完整地列出这些类型,这样我就可以引用这些类型。这个问题是否有标准、提升或其他解决方案? 最佳答案 IstheresuchaheaderfortheSTLcontainers?不,没有。Aretherestandard,boostorothersolutionstothisproblem?据我所知没有。您必须包含这些header。

c++ - 使用 STL 排序就地排序表

我有一个存储为(i,j,k)格式(来自稀疏矩阵)的巨大表(大约50Gb)uint32_t*idx1,*idx2;float*vals;uint32_ttablesize;并且我想使用作为idx1和idx2函数的给定比较函数对其进行适当的排序。这可以使用std::sort完成吗?具体来说,稀疏矩阵中每个值为v的非零条目(i,j)的存储方式是将i放在idx1中,将j放在idx2中,将v放在vals中的相应条目中。然后我想根据(i1,j1,v1)对这些条目进行排序(i1我能够搜集到的关于在非标准数据类型上使用std::sort的示例假设每个被比较的项目都是一个类的单个实例;这里每个项目都由不

c++ - 返回时交换 STL?

很抱歉问了这么长的问题,但我尽量说清楚。这在某种程度上遵循了我之前关于stringsinC++的问题。.我试图弄清楚如何在不分配冗余内存的情况下从函数返回std::string,不依赖NRVO。我不想依赖NRVO的原因是:目前使用的编译器不支持即使支持它也可能不会始终在Debug模式下启用在某些情况下可能会失败(example)请注意,我需要一个C++03兼容的解决方案(因此没有C++0x右值引用,不幸的是......)最简单的方法是通过引用传递并执行std::swap,就像这样voidtest(std::string&res){std::strings;//...res.swap(s

c++ - STL 容器元素是否明确要求 (noexcept) 可破坏?

C++11(和C++14)STL容器有noexcept析构函数和clear()成员函数。这意味着元素应该有noexcept析构函数,或者至少存储在容器中的实际元素在被销毁时不应该抛出任何异常——或者更准确地说,相应的allocator_traits::destroy调用不应抛出。这是否在标准的任何地方指定为要求(明确或由另一个明确要求暗示)?如果不是,为什么?我知道is_nothrow_constructible需要noexcept析构函数,但是is_constructible单独没有,并且容器要求是根据概念而不是类型特征模板指定的。 最佳答案

c++ - 为什么不能将 const 对象放入 STL 容器中?

请参阅下面的代码-我正在尝试将const对象放入vector中。我知道答案是“STL容器要求对象是可分配的和可复制构造的”,但是,在不引用标准的情况下,任何人都可以解释这样做的问题是什么?我不明白为什么不能复制这样的类(除了c++不允许)。它只是一个存储的值,不允许更改-为什么不能将它放在一个vector中,简单地创建另一个这些对象?#include//Attempt1///home/doriad/Test/Test.cxx:3:8:error:non-staticconstmember‘constintMyClass::x’,can’tusedefaultassignmentoper

c++ - RAII 和推导的模板参数

这是我在使用RAII时经常遇到的一个问题。我想知道是否有人对此有好的解决方案。从您的标准RAII实用程序类开始:classRAIIHelper{RAIIHelper(){AcquireAResource();}~RAIIHelper(){ReleaseTheResource();}};现在,由于各种原因,我需要把它做成一个模板。我们还假设它的构造函数接受模板参数类型的参数:templateclassRAIIHelper{RAIIHelper(Targ){AcquireAResource();}~RAIIHelper(){ReleaseTheResource();}};现在考虑一个使用站

c++ - Dll内存管理

我对Windows如何管理.dll的内存没有任何疑问。当.dll加载到主机时进程,内存是怎么管理的?.dll是否可以访问整个主机进程可用的内存或者只是其中的一部分?即是内存有限制由函数内部分配.dll?STL类如字符串、vector(动态地增加存储空间)等dll,在这里工作没有问题吗? 最佳答案 “内存管理”通常是一项分担的责任。操作系统将地址空间以大块的形式交给运行时,然后由运行时将其以较小的部分交给程序。该地址空间可能已分配也可能未分配RAM。(如果没有,会有交换空间来支持它)基本上,当加载DLL时,Windows会为代码和数据